using System.Data;
using System.Collections;
using Microsoft.VisualBasic;
using System.Diagnostics;
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;



namespace MsgBox
{
    public class MsgBox : System.Web.UI.WebControls.WebControl, IPostBackEventHandler
    {

        //Heredo de WebControl
        //Implemento IPostBackEventHandler para poder enviar mensajes desde el código JavaScript

        //Acá se guarda el mensaje a mostrar
        private string _Message;
        //Acá se guarda la clave para poder identificar a que mensaje se responde.
        private string _Key;
        //Acá guardamos si se desea disparar el evento en el Si
        private bool _PostBackOnYes;
        //Y aquí si se desea disparar el evento en el No
        private bool _PostBackOnNo;

        //Definimos los eventos que puede disparar este control
        public delegate void YesChoosedEventHandler(object sender, string Key);
        
        private YesChoosedEventHandler YesChoosedEvent;

        public event YesChoosedEventHandler YesChoosed
        {
            add
            {
                YesChoosedEvent = (YesChoosedEventHandler)System.Delegate.Combine(YesChoosedEvent, value);
            }
            remove
            {
                YesChoosedEvent = (YesChoosedEventHandler)System.Delegate.Remove(YesChoosedEvent, value);
            }
        }

        public delegate void NoChoosedEventHandler(object sender, string Key);
        
        private NoChoosedEventHandler NoChoosedEvent;

        public event NoChoosedEventHandler NoChoosed
        {
            add
            {
                NoChoosedEvent = (NoChoosedEventHandler)System.Delegate.Combine(NoChoosedEvent, value);
            }
            remove
            {
                NoChoosedEvent = (NoChoosedEventHandler)System.Delegate.Remove(NoChoosedEvent, value);
            }
        }


        //Este método se utiliza para mostrar un mensaje de confirmación.
        public void ShowConfirmation(string Message, string Key, bool PostBackOnYes, bool PostBackOnNo)
        {
            //El ÑaÑa es para identificar que es un mensaje de confirmación (ver Render)
            _Message = "ÑaÑa" + Message;
            _Key = Key;
            _PostBackOnYes = PostBackOnYes;
            _PostBackOnNo = PostBackOnNo;
        }

        //Este método se usa para mostrar un mensaje simple
        public void ShowMessage(string Message)
        {
            _Message = Message;
        }

        //Preparamos el control para enviar la función javascript
        protected override void OnPreRender(EventArgs e)
        {
            if (!base.Page.ClientScript.IsClientScriptBlockRegistered("MsgBox"))
            {
                //Registro todo el script del control
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "MsgBox", FuncionJava1());

            }
        }

        private string FuncionJava1()
        {
            //Acá esta la clave de todo este ejemplo...

            //Si no se dispara el evento en el Si, se vacía la variable.
            string miPostBackOnYes = "MsgBoxTextoMensaje=\"\";";
            //Si no se dispara el evento en el No, se vacia la variable.
            string miPostBackOnNo = "MsgBoxTextoMensaje=\"\";";

            //Dependiendo lo que se elija, hacemos referencia o no, a la función que ejecuta el postback.
            //Además recordamos quien esta disparando el evento. (_Key)
            if (_PostBackOnYes)
            {
                //El .Net Framework guarda en miPostBackOnYes la llamada a la función
                //javascript que dispara el evento
                miPostBackOnYes = Page.ClientScript.GetPostBackEventReference(this, "Yes" + _Key);
            }
            if (_PostBackOnNo)
            {
                //El .Net Framework guarda en miPostBackOnNo la llamada a la función
                //javascript que dispara el evento

                miPostBackOnNo = Page.ClientScript.GetPostBackEventReference(this, "No_" + _Key);
            }

            //Como se ve, se programa el evento onfocus del objeto window y se dispara la función.
            //La función verifica si MsgBoxTextoMensaje esta vacía, si es así, no hace nada, de
            //lo contrario muestra el cartel o la confirmación, y luego vacía la variable.
            //En el caso de confirmación se dispara la función java guardada en
            //miPostBackOnYes ó en miPostBackOnNo
            // Modificado para funcionar con firefox.
            /*return "<script language=\"javascript\"> " + 
             * "var MsgBoxTipoMensaje; " + 
             * "var MsgBoxTextoMensaje; " + 
             * "window.attachEvent(\"onfocus\", MsgBoxMostrarMensaje); " 
             * + "function MsgBoxMostrarMensaje() { " + 
             * "if (MsgBoxTextoMensaje) { " 
             * + "if (MsgBoxTextoMensaje != \"\") { " 
             * + "if (MsgBoxTipoMensaje==2) {" 
             * + " alert(MsgBoxTextoMensaje); " 
             * + "} else {" + "if (confirm(MsgBoxTextoMensaje)) { " + miPostBackOnYes + "} else { " + miPostBackOnNo + "}} MsgBoxTextoMensaje=\"\"; " + " }}} </script>";
            */
            StringBuilder sb = new StringBuilder();
            sb.Append("<script language=\"javascript\"> ");
            sb.Append("var MsgBoxTipoMensaje; ");
            sb.Append("var MsgBoxTextoMensaje; ");
            sb.Append("if(window.attachEvent)window.attachEvent(\"onfocus\",");
            sb.Append("MsgBoxMostrarMensaje); ");
            sb.Append("else window.addEventListener(\"load\",MsgBoxMostrarMensaje,false); ");
            sb.Append("function MsgBoxMostrarMensaje() { ");
            sb.Append("if (MsgBoxTextoMensaje) { ");
            sb.Append("if (MsgBoxTextoMensaje != \"\") { ");
            sb.Append("if (MsgBoxTipoMensaje==2) {");
            sb.Append(" alert(MsgBoxTextoMensaje); ");
            sb.Append("} else {");
            sb.Append("if (confirm(MsgBoxTextoMensaje)) { ");
            sb.Append(miPostBackOnYes);
            sb.Append("} else { ");
            sb.Append(miPostBackOnNo);
            sb.Append("}} MsgBoxTextoMensaje=\"\"; ");
            sb.Append(" }}} </script>");
            return sb.ToString();
        }

        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            //Dibujamos el control
            if (ModoDisenio(this))
            {
                //Si estamos en tiempo diseño. Muestro el nombre del control.
                writer.Write(this.ID);
            }
            else
            {
                //Estamos en tiempo de ejecución. Envió el script con el contenido
                //de las variables de JavaScript que corresponda

                if (_Message != string.Empty)
                {
                    //Antes de hacer nada reemplazo los Enter por espacios,
                    //las comillas dobles por comillas simples.
                    //Sino lo hacemos, no sale el cartel en el navegador.
                    System.Text.StringBuilder miSB = new System.Text.StringBuilder(_Message);

                    miSB.Replace("\n", " ");
                    miSB.Replace("\"", "\'");

                    //Verifico el tipo de mensaje
                    if (miSB.ToString().StartsWith("ÑaÑa"))
                    {
                        //Es un mensaje de confirmación. (confirm)
                        //Envío solo el valor de las variables de JavaScript, la función
                        // se ejecutará cuando tome el foco la pagina. (Ver OnPreRender)
                        this.Page.Response.Write("<script>MsgBoxTipoMensaje=1; MsgBoxTextoMensaje=\"" + miSB.ToString().Substring(4) + "\";</script>");
                    }
                    else
                    {
                        //Es un mensaje común. (alert)
                        //Envío solo el valor de las variables de JavaScript, la función
                        // se ejecutará cuando tome el foco la pagina. (Ver OnPreRender)
                        this.Page.Response.Write("<script>MsgBoxTipoMensaje=2; MsgBoxTextoMensaje=\"" + miSB.ToString() + "\";</script>");
                    }
                    miSB = null;
                }
            }
        }

        //Función privada para verificar si el control esta en modo diseño.
        private static bool ModoDisenio(System.Web.UI.WebControls.WebControl QueControl)
        {
            bool DesignMode = false;
            try
            {
                DesignMode = QueControl.Site.DesignMode;
            }
            catch
            {

            }
            return DesignMode;
        }

        //Este método se ejecuta cuando el usuario clic en aceptar o cancelar.
        public void RaisePostBackEvent(string eventArgument)
        {
            switch (eventArgument.Substring(0, 3))
            {
                case "Yes":

                    //Si eligió Aceptar la primera parte del argumento es Yes (Ver FuncionJava1)
                    //Disparo el evento en la página. Le envío en "Key" quien hizo la llamada
                    if (YesChoosedEvent != null)
                        YesChoosedEvent(this, eventArgument.Substring(3));
                    break;
                case "No_":

                    //Si eligió Aceptar la primera parte del argumento es No_ (Ver FuncionJava1)
                    //Disparo el evento en la página. Le envío en "Key" quien hizo la llamada
                    if (NoChoosedEvent != null)
                        NoChoosedEvent(this, eventArgument.Substring(3));
                    break;
            }
        }

    }

}
